<?php

/** 格式化关联数据
 * @param $val 当前数据的关联值
 * @param string $model 被关联的模型
 * @param string $field 要取的被关联的模型字段
 * ---------------以下是通过中间表多对多需要的参数
 * @param string $table 中间表
 * @param string $fkey 关联表中当前数据的主键
 * @param string $rkey 关联表中被关联模型的主键
 * ---------------以上是通过中间表多对多需要的参数
 * @return mixed|string
 */
function format_relation($val, $model, $field='title', $table='', $fkey='', $rkey=''){
    //没有关联表，直接取值
    if(!$table) return format_model_field($val, $model,$field);

    //有关联表，先读取中间关联表，再取值
    $value = '';
    $rlist = M($table)->where(array($fkey=>$val))->select();
    if(!$rlist) return $value;

    foreach ($rlist as $row){
        $value .= ','.format_model_field($row[$rkey], $model, $field);
    }
    $value = substr($value, 1);
    return $value;
}

/** 格式化属性关联关系字段
 * @param int $val 值
 * @param string $model 模型
 * @param string $field 字段
 * @return mixed
 */
function format_model_field($val, $model, $field='title'){
    return D($model)->keyFind($val, $field);
}

/** 格式化指定条件下某对象的字段值
 * @param array $where 条件
 * @param string $model 模型
 * @param string $field 字段
 * @return mixed
 */
function format_model_field2($where, $model, $field='title'){
    return D($model)->findOne($where, $field);
}

/** 格式化CMS系统中自定义字段的值
 * @param int $fieldId 字段ID
 * @param int $content_id 内容ID
 * @return mixed
 */
function format_cms_value($fieldId, $content_id){
    return format_model_field2(array('field_id'=>$fieldId,'content_id'=>$content_id), 'Todo/Cms/Values', 'values');
}

/**
 * 格式化数据字典
 * @param string $val 值
 * @param string $dictCode 数据字典代码
 * @return mixed
 */
function format_dict($val, $dictCode){
    return \Todo\Service\DictService::getInstance()->getDictTitle($dictCode, $val);
}

/**
 * 格式化用户
 * @param int $userId 用户ID
 * @return string
 */
function format_user($userId){
    return \Todo\Service\UserService::getInstance()->cacheFindUser($userId, 'nickname');
}

/**
 * 格式化日期
 * @param int $date
 * @param string $format
 * @return bool|string
 */
function format_date($date=0, $format='Y-m-d'){
    if(!$date) $date = NOW_TIME;
    echo date($format, $date);
}

/**
 * 格式化日期和时间
 * @param int $date
 * @param string $format
 * @return bool|string
 */
function format_datetime($date=0, $format='Y-m-d H:i:s'){
    if(!$date) $date = NOW_TIME;
    echo date($format, $date);
}

/**
 * 格式化时间
 * @param int $date
 * @param string $format
 * @return bool|string
 */
function format_time($date=0, $format='H:i:s'){
    if(!$date) $date = NOW_TIME;
    echo date($format, $date);
}

/**
 * 格式化文件
 * @param int $fileId 文件ID
 * @param string $field=path 字段,为空返回整个数组
 * @return mixed
 */
function format_file($fileId, $field='url'){
    if(!$fileId) return '';
    return \Todo\Service\FileService::getInstance()->cacheFindFile($fileId, $field);
}

/**
 * 格式化文件大小
 * @param int $size 文件字节数
 * @return mixed
 */
function format_size($size){
    Files::format_bytes($size);
}

/**
 * 格式化日期中的周
 * @param int $date
 */
function format_week($date=0){
    $weeks = array('日','一','二','三','四','五','六');
    if(!$date) $date = NOW_TIME;
    echo $weeks[intval(date('w', $date))];
}

/** 初始化关联数据的控件
 * @param $val 当前数据的关联值
 * @param string $model 被关联的模型
 * @param string $field 要取的被关联的模型字段
 * ---------------以下是通过中间表多对多需要的参数
 * @param string $table 中间表
 * @param string $fkey 关联表中当前数据的主键
 * @param string $rkey 关联表中被关联模型的主键
 * ---------------以上是通过中间表多对多需要的参数

 */
function init_relation($val, $model, $field='title', $table='', $fkey='', $rkey=''){
    //没有关联表，直接取值
    if(!$table) {
        $ids = explode(",", $val);
    }else{
        $list = M($table)->where(array($fkey=>$val))->select();
        $ids = \Todo\Util\ArrayUtil::getColumn($list, $rkey);
    }
    return init_selected($ids, $model,$field);
}

/**
 * 初始化select2中已经选择的数据
 * @param array $ids 已选中数据
 * @param string $model 数据的模型
 * @param string $field 显示文本字段
 */
function init_selected($ids, $model, $field){
    $html = '';
    foreach($ids as $v){
        $html .= '<option value="'.$v.'" selected>' .  D($model)->keyFind($v, $field). '</option>';
    }
    return $html;
}